关于VBA中的错误处理 您所在的位置:网站首页 vba 错误处理方式 关于VBA中的错误处理

关于VBA中的错误处理

2024-07-09 16:55| 来源: 网络整理| 查看: 265

现在看来关于VBA中的错误处理语句,应该主要有三种形式:①On Error Resume Next;②On Error Goto 0;③On Error Goto ErrorHnadler.可以说这三种就涵盖了几乎所有的错误处理语句.下面是关于这三种错误处理语句的一点认识:

启动一个错误处理程序并指定该子程序在一个过程中的位置;也可用来禁止一个错误处理程序。

语法

On Error GoTo line

On Error Resume Next

On Error GoTo 0

On Error 语句的语法可以具有以下任何一种形式:

语句描述

On Error GoTo line启动错误处理程序,且该例程从必要的 line 参数中指定的 line 开始。line 参数可以是任何行标签或行号。如果发生一个运行时错误,则控件会跳到 line,激活错误处理程序。指定的 line 必须在一个过程中,这个过程与 On Error 语句相同; 否则会发生编译时间错误。

On Error Resume Next说明当一个运行时错误发生时,控件转到紧接着发生错误的语句之后的语句,并在此继续运行。访问对象时要使用这种形式而不使用 On Error GoTo。

On Error GoTo 0禁止当前过程中任何已启动的错误处理程序。

说明

如果不使用 On Error 语句,则任何运行时错误都是致命的;也就是说,结果会导致显示错误信息并中止运行。

在任何过程中,一旦错误处理程序处理了错误,在当前过程中就会从 Resume 语句指定的位置恢复运行。

注意

一个错误处理程序不是 Sub 过程或 Function 过程。它是一段用行标签或行号标记的代码。

错误处理程序依靠 Err 对象的 Number 属性中的值来确定错误发生的原因。在其它任何错误发生之前,或在调用一个可能会导致错误发生的过程之前,错误处理程序应该先测试或存储 Err 对象中相关的属性值。Err 对象中的属性值只反映最近发生的错误。Err.Description 中包含有与 Err.Number 相关联的错误信息。

On Error Resume Next

会使程序从紧随产生错误的语句之后的语句继续执行,或是从紧随最近一次调用含有 On Error Resume Next 语句的过程的语句继续运行。这个语句可以置运行时错误于不顾,使程序得以继续执行。可以将错误处理程序放置在错误发生的地方,而不必将控件传输到过程中的其它位置。

On Error GoTo 0

停止在当前过程中处理错误。即使过程中包含编号为 0 的行,它也不把行 0 指定为处理错误的代码的起点。如果没有 On Error GoTo 0 语句,在退出过程时,错误处理程序会自动关闭。

在错误未发生的时候,为了防止错误处理程序代码运行,请像在下段程序中那样,在紧靠着错误处理程序的前面写入 Exit Sub、Exit Function 或 Exit Property 语句。

Sub InitializeMatrix(Var1, Var2, Var3, Var4) On Error GoTo ErrorHandler . . . Exit Sub ErrorHandler: . . . Resume Next End Sub 错误处理程序代码在 Exit Sub 语句之后,而在 End Sub 语句之前,从而与过程中的流程分开。 On Error 语句示例

本示例先使用 On Error GoTo 语句在一个过程中指定错误处理的代码所在。本示例中,试图删除一已经打开的文件从而生成的错误码为 55。这个错误将由示例中的错误处理程序码来处理,处理完後,控制会回到发生错误的语句处。On Error GoTo 0 语句关闭错误陷阱。然后 On Error Resume Next 语句用来改变错误陷阱,以便发觉下一个语句产生的错误的范围。请注意示例中使用 Err.Clear 在错误处理完後,清除 Err 对象的属性。

Sub OnErrorStatementDemo() On Error GoTo ErrorHandler ' 打开错误处理程序。 Open "TESTFILE" For Output As #1 ' 打开输出文件。 Kill "TESTFILE" ' 试图删除已打开的文件。 On Error Goto 0 ' 关闭错误陷阱。 On Error Resume Next ' 改变错误陷阱。 ObjectRef = GetObject("MyWord.Basic") ' 试图启动不存在的对象 '检查可能发生的 Automation 错误。 If Err.Number = 440 Or Err.Number = 432 Then ' 告诉用户出了什么事。然后清除 Err 对象。 Msg = "There was an error attempting to open the Automation object!" MsgBox Msg, , "Deferred Error Test" Err.Clear ' 清除 Err 对象字段。 End If Exit Sub ' 退出程序,以避免进入错误处理程序。 ErrorHandler: ' 错误处理程序。 Select Case Err.Number ' 检查错误代号。 Case 55 ' 发生“文件已打开”的错误。 Close #1 ' 关闭已打开的文件。 Case Else ' 处理其他错误状态 . . . End Select Resume ' 将控制返回到产生错误的语句。 End Sub 关于Resume语句的解释

在错误处理程序结束后,恢复原有的运行。

语法

Resume [0]

Resume Next

Resume line

Resume 语句的语法可以具有以下任何一种形式:

语句描述

Resume如果错误和错误处理程序出现在同一个过程中,则从产生错误的语句恢复运行。如果错误出现在被调用的过程中,则从最近一次调用包含错误处理程序的过程的语句处恢复运行。

Resume Next如果错误和错误处理程序出现在同一个程序中,则从紧随产生错误的语句的下个语句恢复运行。如果错误发生在被调用的过程中,则对最后一次调用包含错误处理程序的过程的语句(或 On Error Resume Next 语句),从紧随该语句之后的语句处恢复运行。

Resume line在必要的 line 参数指定的 line 处恢复运行。line 参数是行标签或行号,必须和错误处理程序在同一个过程中。

说明

在错误处理程序之外的任何地方使用 Resume 语句都会导致错误发生。

下面是一个关于错误处理的例子:

样表如下所示:

image 现在想计算B列与C列的比值的大小,明显的"计划/实际"值肯定会出现除数为0的现象,现在要做的是如何处理这个错误,使程序可以跳过错误行继续运行,并且在将错误的原因标明.

程序如下:

Sub 如何处理错误()    On Error GoTo ErrorHandler    Dim i As Long    Dim TotalR As Long    TotalR = Range("A65536").End(xlUp).Row    For i = 2 To TotalR        Cells(i, 4).Value = Cells(i, 2).Value / Cells(i, 3).Value    Next i    Cells.Columns.AutoFit    Exit SubErrorHandler:    Cells(i, 4).Value = 0    Resume Next'此处意思为返回到出错语句的下一句继续运行,若略掉Next,则从出错语句继续运行,那么就会造成死循环.样表如第3个图所示End Sub

处理后的样表如下所示:

image 程序将出错的单元格赋值为0,并且可以继续运行,避免了程序的中断与错误处理.

image 这是不加Next时的效果,程序运行后会一直运行出错语句,导致程序死循环.由此看出,上面的程序并没有纠正错误的原始数据,想想也是这个道理,很多时候,要做的工作以原始数据为基础,得出一定的结论,有时错误的结论也是一种结论.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有